package handler

import (
	"fitness/go-admin/internal/model"
	"fitness/go-admin/internal/service"
	"fitness/go-admin/pkg/errcode"
	"fitness/go-admin/pkg/response"
	"strconv"

	"github.com/gin-gonic/gin"
)

type PermissionHandler struct {
	service service.PermissionService
}

func NewPermissionHandler(service service.PermissionService) *PermissionHandler {
	return &PermissionHandler{service: service}
}

// List 获取权限列表
// @Summary 获取权限列表
// @Description 获取系统中所有权限列表（需要管理员权限）
// @Tags 权限管理
// @Accept json
// @Produce json
// @Success 200 {object} response.Response{data=[]model.Permission}
// @Router /api/v1/permissions [get]
func (h *PermissionHandler) List(c *gin.Context) {
	permissions, err := h.service.List()
	if err != nil {
		response.Error(c, 500, err.Error())
		return
	}

	response.Success(c, permissions, "获取成功")
}

// Create 创建权限
// @Summary 创建权限
// @Description 创建新的权限（需要管理员权限）
// @Tags 权限管理
// @Accept json
// @Produce json
// @Param request body model.PermissionCreateReq true "权限信息"
// @Success 200 {object} response.Response
// @Router /api/v1/permissions [post]
func (h *PermissionHandler) Create(c *gin.Context) {
	var req model.PermissionCreateReq
	if err := c.ShouldBindJSON(&req); err != nil {
		response.Error(c, 400, "参数错误: "+err.Error())
		return
	}

	if err := h.service.Create(&req); err != nil {
		if bizErr, ok := err.(*errcode.BusinessError); ok {
			response.ErrorWithBusiness(c, bizErr)
			return
		}
		response.Error(c, 500, err.Error())
		return
	}

	response.Success(c, nil, "创建成功")
}

// GetRolePermissions 获取角色的权限列表
// @Summary 获取角色的权限列表
// @Description 获取指定角色的所有权限（需要管理员权限）
// @Tags 权限管理
// @Accept json
// @Produce json
// @Param id path int true "角色ID"
// @Success 200 {object} response.Response{data=[]model.Permission}
// @Router /api/v1/roles/{id}/permissions [get]
func (h *PermissionHandler) GetRolePermissions(c *gin.Context) {
	roleID, err := strconv.ParseUint(c.Param("id"), 10, 32)
	if err != nil {
		response.Error(c, 400, "角色ID格式错误")
		return
	}

	permissions, err := h.service.GetRolePermissions(uint(roleID))
	if err != nil {
		if bizErr, ok := err.(*errcode.BusinessError); ok {
			response.ErrorWithBusiness(c, bizErr)
			return
		}
		response.Error(c, 500, err.Error())
		return
	}

	response.Success(c, permissions, "获取成功")
}

// AssignPermissions 为角色分配权限
// @Summary 为角色分配权限
// @Description 批量为角色分配权限，会覆盖原有权限（需要管理员权限）
// @Tags 权限管理
// @Accept json
// @Produce json
// @Param id path int true "角色ID"
// @Param request body model.AssignPermissionsReq true "权限ID列表"
// @Success 200 {object} response.Response
// @Router /api/v1/roles/{id}/permissions [post]
func (h *PermissionHandler) AssignPermissions(c *gin.Context) {
	roleID, err := strconv.ParseUint(c.Param("id"), 10, 32)
	if err != nil {
		response.Error(c, 400, "角色ID格式错误")
		return
	}

	var req model.AssignPermissionsReq
	if err := c.ShouldBindJSON(&req); err != nil {
		response.Error(c, 400, "参数错误: "+err.Error())
		return
	}

	if err := h.service.AssignPermissionsToRole(uint(roleID), req.PermissionIDs); err != nil {
		if bizErr, ok := err.(*errcode.BusinessError); ok {
			response.ErrorWithBusiness(c, bizErr)
			return
		}
		response.Error(c, 500, err.Error())
		return
	}

	response.Success(c, nil, "权限分配成功")
}

// RemovePermission 移除角色权限
// @Summary 移除角色权限
// @Description 移除角色的指定权限（需要管理员权限）
// @Tags 权限管理
// @Accept json
// @Produce json
// @Param roleId path int true "角色ID"
// @Param permissionId path int true "权限ID"
// @Success 200 {object} response.Response
// @Router /api/v1/roles/{roleId}/permissions/{permissionId} [delete]
func (h *PermissionHandler) RemovePermission(c *gin.Context) {
	roleID, err := strconv.ParseUint(c.Param("roleId"), 10, 32)
	if err != nil {
		response.Error(c, 400, "角色ID格式错误")
		return
	}

	permissionID, err := strconv.ParseUint(c.Param("permissionId"), 10, 32)
	if err != nil {
		response.Error(c, 400, "权限ID格式错误")
		return
	}

	if err := h.service.RemovePermissionFromRole(uint(roleID), uint(permissionID)); err != nil {
		if bizErr, ok := err.(*errcode.BusinessError); ok {
			response.ErrorWithBusiness(c, bizErr)
			return
		}
		response.Error(c, 500, err.Error())
		return
	}

	response.Success(c, nil, "权限移除成功")
}
